Q: QuickTime 6.4 にアップグレードすると、アプリケーションをビルドできなくなるようです。あるケースでは、Mac OS X 10.2.6 の上で CodeWarrior 8.3 を使用して Mach-O ターゲットをビルドしようとしていますが、AVAILABLE_MAC_OS_X_VERSION_10_3_AND_LATER に関係する解析エラーが発生するようになりました。どうしたら直せますか?
また、Mac OS X 10.3 のヘッダを使ってビルドできるかどうかを判定するために、MAC_OS_X_VERSION_10_3 が定義されているかどうかを見ています。QuickTime 6.4 は MacOS X 10.2.x のシステムで AvailabilityMacros.h を更新したようで、これが定義されています。MAC_OS_X_VERSION_10_3 が定義されているかどうかにかかわらず、OS の複数のバージョンでコードをビルドできるように条件を設定するには、どうするのが正しいのでしょうか。
A: フレームワーク(今度の場合は QuickTime 6.4)をインストールまたはアップデートした場合には、プロジェクトが利用するすべてのコンパイル済みヘッダを必ず再コンパイルするようにしてください。また、コードの条件を設定するときに、特定の OS バージョンマクロ(今回の場合は MAC_OS_X_VERSION_10_3 )の有無を判断条件とするべきではありません。
QuickTime 6.4 は、新しい API を導入します。この API は、Mac OS X 10.2.x のシステムの場合には、QuickTime 6.4 をインストールすれば利用でき、Mac OS X 10.3 のシステムでは最初から利用できます。これらの API は、AVAILABLE_MAC_OS_X_VERSION_10_3_AND_LATER というマクロで示されます。このマクロは、更新された AvailabilityMacros.h (/usr/include/AvailabilityMacros.h )で定義されていますが、Mac OS X 10.2 に含まれているバージョンのヘッダ・ファイルでは定義されていません。
注:
QuickTime 6.4 をインストールすると、以前のバージョンの AvailabilityMacros.h は、AvailabilityMacros.h.orig に名前が変更されます。
|
これらの利用可能バージョンマクロによって、使用している API が導入された OS のバージョンまたはフレームワークのアップデートを知ることができるほか、コンパイラが、弱いリンクにしておくべきルーチンを知ることができます。利用可能バージョンマクロの詳細については、TN:2064 Ensuring Backward Binary Compatibility - Weak Linking and Availability Macros on Mac OS X を参照してください。
解決策:
- CodeWarrior のコンパイル済みヘッダを再ビルドします。
- Project Builder のコンパイル済みヘッダを再ビルドします。
MAC_OS_X_VERSION_10_3 が定義されているかどうかをテストして Mac OS X 10.2.x または Mac OS X 10.3 のどちらでビルドを行っているのかを判定しないようにします。
1)CodeWarrior の Mach-O プロジェクトでコンパイル済みヘッダを使用している場合、「C/C++ Language Settings」パネルでプリフィックスファイルとして MacHeadersMach-O.h を設定していると仮定すると、次の手順でヘッダを再ビルドできます。
- Metrowerks CodeWarrior のディレクトリまで移動します。
- MSL/(MSL_Build_Projects)/OS X/ 内で Build.MacOSX.mcp プロジェクトを探し出します。
- ダブルクリックして Build.MacOSX.mcp プロジェクトを開きます。
- 「Project」メニューから「Make (Command+M)」を選択します。
2)Project Builder/Xcode のユーザで gcc 2.95 または gcc 3.1 を使用して開発を行っていると、次のエラーが生じることがあります。
/System/Library/Frameworks/QuickTime.framework/Headers/QuickTime.h:20:
warning:could not use precompiled header
'/System/Library/Frameworks/Carbon.framework/Headers/Carbon-gcc3.p',
because:/System/Library/Frameworks/QuickTime.framework/Headers/
QuickTime.h:20:
warning:'AvailabilityMacros.h' has different date than in precomp
|
このエラーを直す場合にも、fixPrecomp を使用してコンパイル済みヘッダの再ビルドする必要があります。
「ターミナル」で次のように入力します。sudo fixPrecomps -force
3)コードの条件を設定するときに、特定の OS バージョンマクロ(今回の場合は MAC_OS_X_VERSION_10_3 )の有無を判断条件とするべきではありません。リスト 1 およびリスト 1a に示す判定を行いたいと思うかもしれませんが、これらの方法には欠陥があり、失敗する可能性があります。
重要:
MAC_OS_X_VERSION_10_3 マクロを使用してコードの条件を設定すると、想定外の結果が生じる可能性があることを具体的に示すために、リスト 1 とリスト 1a に、正しくない使い方の例を示します。
|
リスト 1. 正しくないテスト: これをしないこと!
|
// 間違い: これは、Mac OS 10.2 のシステムで、
// QuickTime 6.4 がインストールされていると、MAC_OS_X_VERSION_10_3 が定義されているため失敗する。
#ifdef MAC_OS_X_VERSION_10_3
// Mac OS X 10.3 専用のコード...
#endif
|
リスト 4 正しくないテスト: これをしないこと!
|
// 間違い: これは、Mac OS 10.2 のシステムで、
// QuickTime 6.4 がインストールされていないと失敗する。
// MAC_OS_X_VERSION_10_3 が定義されていないと、
// 値がゼロであると解釈され、判定式は (1020 >= 0) となり、
// 真(true)と判定されるため、Mac OS X 10.3 専用のコードが
// 内部で使用されることになります。
#if MAC_OS_X_VERSION_MAX_ALLOWED >= MAC_OS_X_VERSION_10_3
// Mac OS X 10.3 専用のコード...
#endif
|
デフォルトでは、MAC_OS_X_VERSION_MAX_ALLOWED が、コンパイルを行っている Mac OS X のバージョンを示します。MacOS 10.2.x の場合、MAC_OS_X_VERSION_MAX_ALLOWED は、1020 と定義されており、Mac OS X 10.3 では 1030 と定義されている、という具合に続きます。条件判断の手段として MAC_OS_X_VERSION_MAX_ALLOWED を使用することで、対象コードが Mac OS X 10.3 以降でのみコンパイルされるようになります。
リスト 2. 10.3 以降でのみコンパイルされるように条件設定
|
#if MAC_OS_X_VERSION_MAX_ALLOWED >= 1030
// Mac OS X 10.3 専用のコード...
#endif
|
参考資料:
[2003 年 10 月 21 日] |